\section{Пример вычисления CRC32}
\myindex{CRC32}
\label{sec:CRC32}

\newcommand{\URLCRCSRC}{\url{http://go.yurichev.com/17327}}

Это распространенный табличный способ вычисления хеша алгоритмом 
CRC32\footnote{Исходник взят тут: \URLCRCSRC}.

\lstinputlisting[style=customc]{\CURPATH/CRC.c}

\myindex{\CLanguageElements!for}
Нас интересует функция \TT{crc()}. 
Кстати, обратите внимание на два инициализатора в выражении \TT{for()}: \TT{hash=len, i=0}. 
Стандарт \CCpp, конечно, допускает это. А в итоговом коде, вместо одной операции инициализации цикла, будет две.

Компилируем в MSVC с оптимизацией (\Ox). 
Для краткости, я приведу только функцию \TT{crc()}, с некоторыми комментариями.

\lstinputlisting[style=customasmx86]{\CURPATH/CRC_2_RU.asm}

Попробуем то же самое в GCC 4.4.1 с опцией \Othree:

\lstinputlisting[style=customasmx86]{\CURPATH/CRC_gcc_O3_RU.asm}

\myindex{x86!\Instructions!NOP}
\myindex{x86!\Instructions!LEA}
GCC немного выровнял начало тела цикла по 8-байтной границе, для этого добавил \\
\NOP и \TT{lea esi, [esi+0]} (что тоже \IT{холостая операция}). 
Подробнее об этом смотрите в разделе о npad~(\myref{sec:npad}).

